Основы цифровой обработки сигналов
Цифровая модуляция
Основные определения
Сущность модуляции заключается в том, что формируется некоторое колебание (чаще всего гармоническое), называемое несущим колебанием (или просто несущей) и какой-либо из параметров этого колебания изменяется во времени пропорционально исходному информационному сигналу. Исходный сигнал, содержащий некоторую информацию, называют модулирующим, а результирующее колебание – модулированным сигналом. Обратный процесс – выделение модулирующего сигнала из модулированного колебания – называется демодуляцией.
В цифровой связи передается последовательность целых чисел , которые могут принимать значения из некоторого конечного множества. Эти числа, называемые символами, поступают от источника информации с периодом , а частота, соответствующая этому периоду, называется символьной скоростью .
При модуляции цифровых сигналов каждому из возможных значений символа сопоставляется некоторый набор параметров несущего колебания. Эти параметры поддерживаются постоянными в течение периода . Таким образом, последовательность чисел преобразуется в ступенчатый сигнал .
Способ модуляции, при котором параметры несущего колебания меняются скачкообразно, называется манипуляцией (keying). В зависимости от того, какие именно параметры изменяются, различают амплитудную, фазовую, частотную и квадратурную манипуляцию.
Амплитудная манипуляция
При амплитудной манипуляции (amplitude shift keying) каждому возможному значению передаваемого символа сопоставляется свое значение амплитуды несущего колебания:
Амплитудная манипуляция является частным случаем квадратурной манипуляции.
Пример. Создадим в Engee амплитудно-манипулированный сигнал и построим его график. Здесь передаваемыми символами является случайная последовательность из двух чисел – 1 и 2. Частота гармонического колебания равна 10 Гц, частота дискретизации составляет 50 Гц, число отсчетов на символ равно 10.
using Plots;
Nsymb = 20; # число символов
FsFd = 10; # число отсчетов на символ
N = Nsymb*FsFd; # общее число отсчетов
Fs = 50; # частота дискретизации
Fc = 10; # несущая частота
t = 0:(1/Fs):((N-1)/Fs); # дискретное время
x = rand([1,2], Nsymb); # передаваемые символы
x = repeat(x, 1, FsFd)'; # повторение символов FsFd раз
x = reshape(x, N, 1); # преобразование матрицы символов в вектор-столбец
s = x.*cos.(2*pi*Fc*t); # амплитудно-манипулированный сигнал
plot(t, s, xlabel="t", ylabel="амплитудно-манипулированный сигнал", legend=false) # построение графика
✏️Задание 1
Задайте в Engee случайную последовательность из 20 символов, принимающих значения из множества . Выполните амплитудную манипуляцию этой последовательности на несущей частоте Гц с числом отсчетов на символ, равным 15.
Решение
using Plots;
Nsymb = 20; # число символов
FsFd = 15; # число отсчетов на символ
N = Nsymb*FsFd; # общее число отсчетов
Fs = 4000; # частота дискретизации
Fc = 1000; # несущая частота
t = 0:(1/Fs):((N-1)/Fs); # дискретное время
x = rand([1,2,3,4], Nsymb); # передаваемые символы
x = repeat(x, 1, FsFd)'; # повторение символов FsFd раз
x = reshape(x, N, 1); # преобразование матрицы символов в вектор-столбец
s = x.*cos.(2*pi*Fc*t); # амплитудно-манипулированный сигнал
plot(t, s, xlabel="t", ylabel="амплитудно-манипулированный сигнал", legend=false) # построение графика
Фазовая манипуляция
При фазовой манипуляции (phase shift keying) каждому возможному значению передаваемого символа сопоставляется свое значение фазы несущего колебания. При этом при переходе от одного символа к другому фаза меняется скачкообразно:
Фазовая манипуляция также является частным случаем квадратурной манипуляции.
Фазовая манипуляция обычно используется при небольшом числе возможных значений начальной фазы (2, 4 или 8).
Пример. Создадим в Engee сигнал с 4-позиционной фазовой манипуляцией и построим его график. Здесь предаваемыми символами является случайная последовательность из 20 чисел, принимающих значения 0 и 1. Частота гармонического колебания равна 10 Гц, частота дискретизации составляет 50 Гц, число отсчетов на символ равно 10.
using Plots;
Nsymb = 20; # число символов
FsFd = 10; # число отсчетов на символ
N = Nsymb*FsFd; # общее число отсчетов
Fs = 50; # частота дискретизации
Fd = Fs / FsFd; # символьная скорость
Fc = 10; # несущая частота
t = 0:(1/Fs):((N-1)/Fs); # дискретное время
x = rand([0,1], Nsymb); # передаваемые символы
x = repeat(x, 1, FsFd)'; # повторение символов FsFd раз
x = reshape(x, N, 1); # преобразование матрицы в вектор-столбец
s = cos.(2*pi*Fc*t + pi/2*x); # фазоманипулированный сигнал
plot(t, s, xlabel="t", ylabel="фазоманипулированный сигнал", legend=false) # построение графика
✏️Задание 2
Задайте в Engee случайную последовательность из 10 символов, принимающих значения из множества . Выполните фазовую манипуляцию этой последовательности на несущей частоте Гц с числом отсчетов на символ, равным 25.
Решение
using Plots;
Nsymb = 10; # число символов
FsFd = 25; # число отсчетов на символ
N = Nsymb*FsFd; # общее число отсчетов
Fs = 10000; # частота дискретизации
Fd = Fs / FsFd; # символьная скорость
Fc = 2500; # несущая частота
t = 0:(1/Fs):((N-1)/Fs); # дискретное время
x = rand([0,1], Nsymb); # передаваемые символы
x = repeat(x, 1, FsFd)'; # повторение символов FsFd раз
x = reshape(x, N, 1); # преобразование матрицы в вектор-столбец
s = cos.(2*pi*Fc*t + pi/2*x); # фазоманипулированный сигнал
plot(t, s, xlabel="t", ylabel="фазоманипулированный сигнал", legend=false) # построение графика
Частотная манипуляция
При частотной манипуляции (frequency shift keying) каждому возможному значению передаваемого символа сопоставляется своя частота несущего колебания. В течение каждого символьного интервала передается гармоническое колебание с частотой, соответствующей текущему символу:
где – сумма с накоплением значений модулирующей последовательности ;
– параметр частотной манипуляции:
Пример. Создадим в Engee двухпозиционный частотно-манипулированный сигнал с возможными значениями символов 0 и 1. Несущая частота составляет 50 Гц, частота дискретизации равна 2000 Гц, число отсчетов на символ равно 10.
using Plots, DSP;
Fc = 50; # несущая частота
Nsymb = 20; # число символов
FsFd = 10; # число отсчетов на символ
N = Nsymb*FsFd; # общее число отсчетов
Fs = 2000; # частота дискретизации
t = [0:1/Fs:(N-1)/Fs;]; # дискретное время
x = rand([0,1], Nsymb); # передаваемые символы
x = repeat(x, 1, FsFd)'; # повторение символов FsFd раз
x = reshape(x, N, 1); # преобразование матрицы в вектор-столбец
opt = (Fc/Fs)*2*pi/maximum(x); # параметр частотной манипуляции
s = cos.(2*pi*Fc*t + opt*cumsum(x, dims=1)); # частотно-манипулированный сигнал
plot(t, s, xlabel="t", ylabel="частотно-манипулированный сигнал", legend=false) # построение графика
Рассчитаем спектральную плотность мощности частотно-манипулированного сигнала.
p = DSP.periodogram(s[:], onesided=true, nfft=length(s), fs=Fs, window=hamming);
plot(freq(p), power(p), xlabel="частота, Гц", ylabel="спектральная плотность мощности", legend=false)
✏️Задание 3
Выполните в Engee частотную манипуляцию последовательности из 30 символов, принимающих случайные значения из множества . Несущая частота составляет 100 Гц, а число отсчетов на символ равно 20. Постройте график спектральной плотности мощности частотно-манипулированного сигнала.
Решение
using Plots, DSP;
Fc = 100; # несущая частота
Nsymb = 20; # число символов
FsFd = 20; # число отсчетов на символ
N = Nsymb*FsFd; # общее число отсчетов
Fs = 2000; # частота дискретизации
t = [0:1/Fs:(N-1)/Fs;]; # дискретное время
x = rand([0,1], Nsymb); # передаваемые символы
x = repeat(x, 1, FsFd)'; # повторение символов FsFd раз
x = reshape(x, N, 1); # преобразование матрицы в вектор-столбец
opt = (Fc/Fs)*2*pi/maximum(x); # параметр частотной манипуляции
s = cos.(2*pi*Fc*t + opt*cumsum(x, dims=1)); # частотно-манипулированный сигнал
plot(t, s, xlabel="t", ylabel="частотно-манипулированный сигнал", legend=false) # построение графика
p = DSP.periodogram(s[:], onesided=true, nfft=length(s), fs=Fs, window=hamming);
plot(freq(p), power(p), xlabel="частота, Гц", ylabel="спектральная плотность мощности", legend=false)
Квадратурная манипуляция
При квадратурной манипуляции (quadrature amplitude shift keying) каждому из возможных значений дискретного символа ставится в соответствие пара величин – амплитуды синфазной и квадратурной составляющих либо амплитуда и начальная фаза несущего колебания:
Параметры аналогового колебания, сопоставленные дискретному символу , удобно представлять в виде комплексного числа. Совокупность этих комплексных чисел для всех возможных значений дискретного символа называется сигнальным созвездием.
На практике используются созвездия, содержащие от 4 до нескольких тысяч точек.
Пример. Создадим в Engee квадратурно-манипулированный сигнал с использованием 16-точечного "квадратного" созвездия.
Создадим векторы амплитуд синфазной и квадратурной составляющих, значения которых случайно выбраны из множества . Частота дискретизации составляет 50 Гц, частота гармонического колебания равна 10 Гц, число отсчетов на символ равно 10.
using Plots;
Nsymb = 20; # число символов
FsFd = 10; # число отсчетов на символ
N = Nsymb*FsFd; # общее число отсчетов
Fs = 50; # частота дискретизации
Fd = Fs / FsFd; # символьная скорость
Fc = 10; # несущая частота
t = 0:(1/Fs):((N-1)/Fs); # дискретное время
a = rand([-3,-1,1,3], Nsymb); # передаваемые символы на синфазной составляющей
a = repeat(a, 1, FsFd)'; # повторение символов FsFd раз
a = reshape(a, N, 1); # преобразование матрицы в вектор-столбец
b = rand([-3,-1,1,3], Nsymb); # передаваемые символы на квадратурной составляющей
b = repeat(b, 1, FsFd)'; # повторение символов FsFd раз
b = reshape(b, N, 1); # преобразование матрицы в вектор-столбец
s = a.*cos.(2*pi*Fc*t) + b.*sin.(2*pi*Fc*t); # квадратурно-манипулированный сигнал
plot(t, s, xlabel="t", ylabel="квадратурно-манипулированный сигнал", legend=false) # построение графика
✏️Задание 4
Задайте в Engee случайную последовательность из 15 символов, принимающих значения из множества . Выполните квадратурную амплитудную манипуляцию этой последовательности. Пусть частота гармонического колебания равна 1500 Гц, а число отсчетов на символ равно 20.
Решение
using Plots;
Nsymb = 15; # число символов
FsFd = 20; # число отсчетов на символ
N = Nsymb*FsFd; # общее число отсчетов
Fs = 4000; # частота дискретизации
Fd = Fs / FsFd; # символьная скорость
Fc = 1500; # несущая частота
t = 0:(1/Fs):((N-1)/Fs); # дискретное время
a = rand([-3,-1,1,3], Nsymb); # передаваемые символы на синфазной составляющей
a = repeat(a, 1, FsFd)'; # повторение символов FsFd раз
a = reshape(a, N, 1); # преобразование матрицы в вектор-столбец
b = rand([-3,-1,1,3], Nsymb); # передаваемые символы на квадратурной составляющей
b = repeat(b, 1, FsFd)'; # повторение символов FsFd раз
b = reshape(b, N, 1); # преобразование матрицы в вектор-столбец
s = a.*cos.(2*pi*Fc*t) + b.*sin.(2*pi*Fc*t); # квадратурно-манипулированный сигнал
plot(t, s, xlabel="t", ylabel="квадратурно-манипулированный сигнал", legend=false) # построение графика